package org.cars.forset.controller;

import com.dtflys.forest.Forest;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.cars.forset.service.MyClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

/**
 * @author caoqianfan
 * @date 2024/3/14 14:35
 */
@RestController
@RequestMapping("/api")
@Slf4j
public class AController {

    // 注入自定义的 Forest 接口实例
    @Resource
    private MyClient myClient;

    @GetMapping("/helloWithInterface")
    public ResponseEntity<String> withInterface() {
        // 调用自定义的 Forest 接口方法
        // 等价于发送 HTTP 请求，请求地址和参数即为 helloForest 方法上注解所标识的内容
        String result = myClient.helloForest();
        // result 即为 HTTP 请求响应后返回的字符串类型数据
        System.out.println(result);
        return ResponseEntity.ok(result);
    }

    @GetMapping("/helloNoInterface")
    public ResponseEntity<String> noInterface() {
        // Get请求
        // 并以 String 类型接受数据
        String str = Forest.get("/hello")
                .backend("okhttp3")        // 设置后端为 okhttp3
                .host("127.0.0.1")         // 设置地址的host为 127.0.0.1
                .port(8080)                // 设置地址的端口为 8080
                .contentTypeJson()         // 设置 Content-Type 头为 application/json
                //.addBody("a", 1)           // 添加 Body 项(键值对)： a, 1
                //.addBody("b", 2)           // 添加 Body 项(键值对)： b, 2
                .maxRetryCount(3)          // 设置请求最大重试次数为 3
                // 设置 onSuccess 回调函数
                .onSuccess((data, req, res) -> log.info("success!"))
                // 设置 onError 回调函数
                .onError((ex, req, res) -> log.info("error!"))
                // 设置请求成功判断条件回调函数
                .successWhen((req, res) -> res.noException() && res.statusOk())
                // 执行并返回Map数据类型对象
                .executeAsString();
        return ResponseEntity.ok(str);
    }

    @PostMapping("/setWithInterface")
    public ResponseEntity<String> setWithInterface(@RequestParam("name") String name, @RequestParam("phone") String phone, @RequestParam("ps") Integer ps) {
        return ResponseEntity.ok(myClient.setTwoParams(name, phone, ps));
    }

    @PostMapping("/setNoInterface")
    public ResponseEntity<String> setNoInterface(@RequestParam("name") String name, @RequestParam("phone") String phone, @RequestParam("ps") Integer ps) {
        // Get请求
        // 并以 String 类型接受数据
        String str = Forest.post("/setTwoParams")
                .backend("okhttp3")        // 设置后端为 okhttp3
                .host("127.0.0.1")         // 设置地址的host为 127.0.0.1
                .port(8080)                // 设置地址的端口为 8080
                .contentTypeJson()         // 设置 Content-Type 头为 application/json
                .addQuery("name", name)           // 添加 Body 项(键值对)： a, 1
                .addQuery("phone", phone)           // 添加 Body 项(键值对)： b, 2
                .addQuery("ps", ps)
                .maxRetryCount(3)          // 设置请求最大重试次数为 3
                // 设置 onSuccess 回调函数
                .onSuccess((data, req, res) -> log.info("success! data={} req={} res={}", data, req, res))
                // 设置 onError 回调函数
                .onError((ex, req, res) -> log.info("error! ex={} req={} res={}", ex, req, res))
                // 设置请求成功判断条件回调函数
                .successWhen((req, res) -> res.noException() && res.statusOk())
                // 执行并返回Map数据类型对象
                .executeAsString();
        return ResponseEntity.ok(str);
    }


}
